package com.hyl.infrastructure.adapter.repository;

import com.hyl.domain.tag.adapter.repository.ITagRepository;
import com.hyl.domain.tag.model.entity.CrowdTagsJobEntity;
import com.hyl.infrastructure.dao.ICrowdTagsDao;
import com.hyl.infrastructure.dao.ICrowdTagsDetailDao;
import com.hyl.infrastructure.dao.ICrowdTagsJobDao;
import com.hyl.infrastructure.dao.po.CrowdTags;
import com.hyl.infrastructure.dao.po.CrowdTagsDetail;
import com.hyl.infrastructure.dao.po.CrowdTagsJob;
import com.hyl.infrastructure.redis.IRedisService;
import org.redisson.api.RBitSet;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Repository;

import javax.annotation.Resource;

/**
 * @author hyl
 * @description 仓储接口用来实现对数据库的操作
 * @create 2025-06-18 15:13
 */
@Repository
public class TagRepository implements ITagRepository {

    @Resource
    private IRedisService redisService;
    @Resource
    private ICrowdTagsDao CrowdTagsDao;
    @Resource
    private ICrowdTagsJobDao CrowdTagsJobDao;
    @Resource
    private ICrowdTagsDetailDao CrowdTagsDetailDao;

    @Override
    public CrowdTagsJobEntity queryCrowdTagsJobEntity(String tagId, String batchId) {
        CrowdTagsJob crowdTagsJob = new CrowdTagsJob();
        crowdTagsJob.setTagId(tagId);
        crowdTagsJob.setBatchId(batchId);
        CrowdTagsJob crowdTagsJobEntity = CrowdTagsJobDao.queryCrowdTagsJob(crowdTagsJob);
        if (crowdTagsJobEntity == null)return null;
        return CrowdTagsJobEntity.builder()
                .tagType(crowdTagsJobEntity.getTagType())
                .tagRule(crowdTagsJobEntity.getTagRule())
                .statStartTime(crowdTagsJobEntity.getStatStartTime())
                .statEndTime(crowdTagsJobEntity.getStatEndTime())
                .build();

    }

    @Override
    public void addCrowdTagsUserId(String tagId, String userId) {

        CrowdTagsDetail crowdTagsDetailReq = new CrowdTagsDetail();
        crowdTagsDetailReq.setUserId(userId);
        crowdTagsDetailReq.setTagId(tagId);
        try {
            CrowdTagsDetailDao.addCrowdTagsUserId(crowdTagsDetailReq);
            //获取BiSet
            RBitSet bitSet = redisService.getBitSet(tagId);
            bitSet.set(redisService.getIndexFromUserId(userId),true);

        }catch (DuplicateKeyException ignore){}

    }

    @Override
    public void updateCrowdTagsStatistics(String tagId, int size) {
        CrowdTags crowdTagsReq = new CrowdTags();
        crowdTagsReq.setTagId(tagId);
        crowdTagsReq.setStatistics(size);
        CrowdTagsDao.updateCrowdTagsStatistics(crowdTagsReq);
    }
}
